/*
 * JavaScriptUtil is a part of JavaScripTools (http://javascriptools.sourceforge.net).
 * This file was compressed using JavaScriptZip (http://javascriptzip.sourceforge.net).
 * Author: Luis Fernando Planella Gonzalez (lfpg.dev at gmail dot com)
 * Version: 2.1.4
 * You may freely distribute this file, just don't remove this header.
*/
var JST_CHARS_NUMBERS="0123456789";
var JST_CHARS_LOWER;
var JST_CHARS_UPPER;
for(var i=50;i<500;i++){
    var c=String.fromCharCode(i);
    var lower=c.toLowerCase();
    var upper=c.toUpperCase();
    if(lower!=upper){
        JST_CHARS_LOWER+=lower;
        JST_CHARS_UPPER+=upper
    }
}
var JST_CHARS_LETTERS=JST_CHARS_LOWER+JST_CHARS_UPPER;
var JST_CHARS_ALPHA=JST_CHARS_LETTERS+JST_CHARS_NUMBERS;
var JST_CHARS_BASIC_LOWER="abcdefghijklmnopqrstuvwxyz";
var JST_CHARS_BASIC_UPPER="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var JST_CHARS_BASIC_LETTERS=JST_CHARS_BASIC_LOWER+JST_CHARS_BASIC_UPPER;
var JST_CHARS_BASIC_ALPHA=JST_CHARS_BASIC_LETTERS+JST_CHARS_NUMBERS;
var JST_CHARS_WHITESPACE=" \t\n\r";
var MILLIS_IN_SECOND=1000;
var MILLIS_IN_MINUTE=60*MILLIS_IN_SECOND;
var MILLIS_IN_HOUR=60*MILLIS_IN_MINUTE;
var MILLIS_IN_DAY=24*MILLIS_IN_HOUR;
var JST_FIELD_MILLISECOND=0;
var JST_FIELD_SECOND=1;
var JST_FIELD_MINUTE=2;
var JST_FIELD_HOUR=3;
var JST_FIELD_DAY=4;
var JST_FIELD_MONTH=5;
var JST_FIELD_YEAR=6;
function getObject(objectName,source){
    if(isEmpty(objectName)){
        return null
    }
    if(!isInstance(objectName,String)){
        return objectName
    }
    if(isEmpty(source)){
        source=self
    }
    if(isInstance(source,String)){
        sourceName=source;
        source=self.frames[sourceName];
        if(source==null) source=parent.frames[sourceName];
        if(source==null) source=top.frames[sourceName];
        if(source==null) source=getObject(sourceName);
        if(source==null) return null
    }
    var document=(source.document)?source.document:source;
    if(document.getElementById){
        var collection=document.getElementsByName(objectName);
        if(collection.length==1) return collection[0];
        if(collection.length>1){
            if(typeof(collection)=="array"){
                return collection
            }
            var ret=new Array(collection.length);
            for(var i=0;i<collection.length;i++){
                ret[i]=collection[i]
            }
            return ret
        }
        return document.getElementById(objectName)
    } else {
        if(document[objectName]) return document[objectName];
        if(document.all[objectName]) return document.all[objectName];
        if(source[objectName]) return source[objectName]
    }
    return null
}
function isInstance(object,clazz){
    if((object==null)||(clazz==null)){
        return false
    }
    if(object instanceof clazz){
        return true
    }
    if((clazz==String)&&(typeof(object)=="string")){
        return true
    }
    if((clazz==Number)&&(typeof(object)=="number")){
        return true
    }
    if((clazz==Array)&&(typeof(object)=="array")){
        return true
    }
    if((clazz==Function)&&(typeof(object)=="function")){
        return true
    }
    var base=object.base;
    while(base!=null){
        if(base==clazz){
            return true
        }
        base=base.base
    }
    return false
}
function booleanValue(object,trueChars){
    if(object==true||object==false){
        return object
    } else {
        object=String(object);
        if(object.length==0){
            return false
        } else {
            var first=object.charAt(0).toUpperCase();
            trueChars=isEmpty(trueChars)?"T1YS":trueChars.toUpperCase();
            return trueChars.indexOf(first)!=-1
        }
    }
}
function isUndefined(object){
    return typeof(object)=="undefined"
}
function invoke(functionName,args){
    var arguments;
    if(args==null||isUndefined(args)){
        arguments="()"
    } else if(!isInstance(args,Array)){
        arguments="(args)"
    } else {
        arguments="(";
        for(var i=0;i<args.length;i++){
            if(i>0){
                arguments+=","
            }
            arguments+="args["+i+"]"
        }
        arguments+=")"
    }
    return eval(functionName+arguments)
}
function invokeAsMethod(object,method,args){
    var arguments;
    if(args==null||isUndefined(args)){
        arguments="()"
    } else if(!isInstance(args,Array)){
        arguments="(args)"
    } else {
        arguments="(";
        for(var i=0;i<args.length;i++){
            if(i>0){
                arguments+=","
            }
            arguments+="args["+i+"]"
        }
        arguments+=")"
    }
    var name="_tmp_invocation";
    object[name]=method;
    try {
        return eval("object."+name+arguments)
    } finally {
        try {
            delete object[name]
        } catch(exception){
            object[name]=null
        }
    }
}
function indexOf(object,array,startingAt){
    if((object==null)||!(array instanceof Array)){
        return-1
    }
    if(startingAt==null){
        startingAt=0
    }
    for(var i=startingAt;i<array.length;i++){
        if(array[i]==object){
            return i
        }
    }
    return-1
}
function inArray(object,array){
    return indexOf(object,array)>=0
}
function removeFromArray(array){
    if(!isInstance(array,Array)){
        return null
    }
    var ret=[];
    var toRemove=removeFromArray.arguments.slice(1);
    for(var i=0;i<array.length;i++){
        var current=array[i];
        if(!inArray(current,toRemove)){
            ret[ret.length]=current
        }
    }
    return ret
}
function arrayConcat(){
    var ret=[];
    for(var i=0;i<arrayConcat.arguments.length;i++){
        var current=arrayConcat.arguments[i];
        if(!isEmpty(current)){
            if(!isInstance(current,Array)){
                current=[current]
            }
            for(j=0;j<current.length;j++){
                ret[ret.length]=current[j]
            }
        }
    }
    return ret
}
function arrayEquals(array1,array2){
    if(!isInstance(array1,Array)||!isInstance(array2,Array)){
        return false
    }
    if(array1.length!=array2.length){
        return false
    }
    for(var i=0;i<array1.length;i++){
        if(array1[i]!=array2[i]){
            return false
        }
    }
    return true
}
function checkAll(object,flag){
    if(typeof(object)=="string"){
        object=getObject(object)
    }
    if(object!=null){
        if(!isInstance(object,Array)){
            object=[object]
        }
        for(i=0;i<object.length;i++){
            object[i].checked=flag
        }
    }
}
function observeEvent(object,eventName,handler){
    object=getObject(object);
    if (!object.aListeners)
        object.aListeners = new Array();
    object.aListeners.push({
        sEvent:eventName,
        handler:handler
    });
    if(object!=null){
        if(object.addEventListener){
            object.addEventListener(eventName,function(e){
                return invokeAsMethod(object,handler,[e])
            },false)
        } else if(object.attachEvent){
            object.attachEvent("on"+eventName,function(){
                return invokeAsMethod(object,handler,[window.event])
            })
        } else {
            object["on"+eventName]=handler
        }
    }
}
function typedCode(event){
    var code=0;
    if(event==null&&window.event){
        event=window.event
    }
    if(event!=null){
        if(event.keyCode){
            code=event.keyCode
        } else if(event.which){
            code=event.which
        }
    }
    return code
}
function stopPropagation(event){
    if(event==null&&window.event){
        event=window.event
    }
    if(event!=null){
        if(event.stopPropagation!=null){
            event.stopPropagation()
        } else if(event.cancelBubble!==null){
            event.cancelBubble=true
        }
    }
    return false
}
function preventDefault(event){
    if(event==null&&window.event){
        event=window.event
    }
    if(event!=null){
        if(event.preventDefault!=null){
            event.preventDefault()
        } else if(event.returnValue!==null){
            event.returnValue=false
        }
    }
    return false
}
function prepareForCaret(object){
    object=getObject(object);
    if(object==null||!object.type){
        return null
    }
    if(object.createTextRange){
        var handler=function(){
            object.caret=document.selection.createRange().duplicate()
        }
        object.attachEvent("onclick",handler);
        object.attachEvent("ondblclick",handler);
        object.attachEvent("onselect",handler);
        object.attachEvent("onkeyup",handler)
    }
}
function isCaretSupported(object){
    object=getObject(object);
    if(object==null||!object.type){
        return false
    }
    if(navigator.userAgent.toLowerCase().indexOf("opera")>=0&&parseInt(navigator.appVersion,10)<9){
        return false
    }
    return object.setSelectionRange!=null||object.createTextRange!=null
}
function isInputSelectionSupported(object){
    object=getObject(object);
    if(object==null||!object.type){
        return false
    }
    return object.setSelectionRange!=null||object.createTextRange!=null
}
function getInputSelection(object){
    object=getObject(object);
    if(object==null||!object.type){
        return null
    }
    if(object.createTextRange&&object.caret){
        return object.caret.text
    } else if(object.setSelectionRange){
        var selStart=object.selectionStart;
        var selEnd=object.selectionEnd;
        return object.value.substring(selStart,selEnd)
    }
    return ""
}
function getInputSelectionRange(object){
    object=getObject(object);
    if(object==null||!object.type){
        return null
    }
    if(object.selectionEnd){
        return [object.selectionStart,object.selectionEnd]
    } else if(object.createTextRange&&object.caret){
        var end=getCaret(object);
        return [end-object.caret.text.length,end]
    }
    return null
}
function setInputSelectionRange(object,start,end){
    object=getObject(object);
    if(object==null||!object.type){
        return
    }
    if(start<0){
        start=0
    }
    if(end>object.value.length){
        end=object.value.length
    }
    if(object.setSelectionRange){
        object.focus();
        object.setSelectionRange(start,end)
    } else if(object.createTextRange){
        object.focus();
        var range;
        if(object.caret){
            range=object.caret;
            range.moveStart("textedit",-1);
            range.moveEnd("textedit",-1)
        } else {
            range=object.createTextRange()
        }
        range.moveEnd('character',end);
        range.moveStart('character',start);
        range.select()
    }
}
function getCaret(object){
    object=getObject(object);
    if(object==null||!object.type){
        return null
    }
    if(object.createTextRange&&object.caret){
        var range=object.caret.duplicate();
        range.moveStart('textedit',-1);
        return range.text.length
    } else if(object.selectionEnd){
        return object.selectionEnd
    }
    return null
}
function setCaret(object,pos){
    setInputSelectionRange(object,pos,pos)
}
function setCaretToEnd(object){
    object=getObject(object);
    if(object==null||!object.type){
        return
    }
    if(object.createTextRange){
        var range=object.createTextRange();
        range.collapse(false);
        range.select()
    } else if(object.setSelectionRange){
        var length=object.value.length;
        object.setSelectionRange(length,length);
        object.focus()
    }
}
function setCaretToStart(object){
    object=getObject(object);
    if(object==null||!object.type){
        return
    }
    if(object.createTextRange){
        var range=object.createTextRange();
        range.collapse(true);
        range.select()
    } else if(object.setSelectionRange){
        object.focus();
        object.setSelectionRange(0,0)
    }
}
function selectString(object,string){
    if(isInstance(object,String)){
        object=getObject(object)
    }
    if(object==null||!object.type){
        return
    }
    var match=new RegExp(string,"i").exec(object.value);
    if(match){
        setInputSelectionRange(object,match.index,match.index+match[0].length)
    }
}
function replaceSelection(object,string){
    object=getObject(object);
    if(object==null||!object.type){
        return
    }
    if(object.setSelectionRange){
        var selectionStart=object.selectionStart;
        var selectionEnd=object.selectionEnd;
        object.value=object.value.substring(0,selectionStart)+string+object.value.substring(selectionEnd);
        if(selectionStart!=selectionEnd){
            setInputSelectionRange(object,selectionStart,selectionStart+string.length)
        } else {
            setCaret(object,selectionStart+string.length)
        }
    } else if(object.createTextRange&&object.caret){
        object.caret.text=string
    }
}
function clearOptions(select){
    select=getObject(select);
    var ret=[];
    if(select!=null){
        for(var i=0;i<select.options.length;i++){
            var option=select.options[i];
            ret[ret.length]=new Option(option.text,option.value)
        }
        select.options.length=0
    }
    return ret
}
function addOption(select,option,sort,textProperty,valueProperty,selectedProperty){
    select=getObject(select);
    if(select==null||option==null){
        return
    }
    textProperty=textProperty||"text";
    valueProperty=valueProperty||"value";
    selectedProperty=selectedProperty||"selected"
    if(isInstance(option,Map)){
        option=option.toObject()
    }
    if(isUndefined(option[valueProperty])){
        valueProperty=textProperty
    }
    var selected=false;
    if(!isUndefined(option[selectedProperty])){
        selected=option[selectedProperty]
    }
    option=new Option(option[textProperty],option[valueProperty],selected,selected);
    select.options[select.options.length]=option;
    if(booleanValue(sort)){
        sortOptions(select)
    }
}
function addOptions(select,options,sort,textProperty,valueProperty,selectedProperty){
    select=getObject(select);
    if(select==null){
        return
    }
    for(var i=0;i<options.length;i++){
        addOption(select,options[i],false,textProperty,valueProperty,selectedProperty)
    }
    if(booleanValue(sort)){
        sortOptions(select)
    }
}
function compareOptions(opt1,opt2){
    if(opt1==null&&opt2==null){
        return 0
    }
    if(opt1==null){
        return-1
    }
    if(opt2==null){
        return 1
    }
    if(opt1.text==opt2.text){
        return 0
    } else if(opt1.text>opt2.text){
        return 1
    } else {
        return-1
    }
}
function setOptions(select,options,addEmpty,sort,textProperty,valueProperty,selectedProperty){
    select=getObject(select);
    var ret=clearOptions(select);
    var addEmptyIsString=isInstance(addEmpty,String);
    if(addEmptyIsString||booleanValue(addEmpty)){
        select.options[0]=new Option(addEmptyIsString?addEmpty:"")
    }
    addOptions(select,options,sort,textProperty,valueProperty,selectedProperty);
    return ret
}
function sortOptions(select,sortFunction){
    select=getObject(select);
    if(select==null){
        return
    }
    var options=clearOptions(select);
    if(isInstance(sortFunction,Function)){
        options.sort(sortFunction)
    } else {
        options.sort(compareOptions)
    }
    setOptions(select,options)
}
function transferOptions(source,dest,all,sort){
    source=getObject(source);
    dest=getObject(dest);
    if(source==null||dest==null){
        return
    }
    if(booleanValue(all)){
        addOptions(dest,clearOptions(source),sort)
    } else {
        var sourceOptions=[];
        var destOptions=[];
        for(var i=0;i<source.options.length;i++){
            var option=source.options[i];
            var options=(option.selected)?destOptions:sourceOptions;
            options[options.length]=new Option(option.text,option.value)
        }
        setOptions(source,sourceOptions,false,sort);
        addOptions(dest,destOptions,sort)
    }
}
function getValue(object){
    object=getObject(object);
    if(object==null){
        return null
    }
    if(object.length&&!object.type){
        var ret=[];
        for(var i=0;i<object.length;i++){
            var temp=getValue(object[i]);
            if(temp!=null){
                ret[ret.length]=temp
            }
        }
        return ret.length==0?null:ret.length==1?ret[0]:ret
    }
    if(object.type){
        if(object.type.indexOf("select")>=0){
            var ret=[];
            for(i=0;i<object.options.length;i++){
                if(booleanValue(object.options[i].selected)){
                    ret[ret.length]=object[i].value;
                    if(!object.multiple){
                        break
                    }
                }
            }
            return ret.length==0?null:ret.length==1?ret[0]:ret
        }
        if(object.type=="radio"||object.type=="checkbox"){
            return booleanValue(object.checked)?object.value:null
        } else {
            return object.value
        }
    } else if(typeof(object.innerHTML)!="undefined"){
        return object.innerHTML
    } else {
        return null
    }
}
function setValue(object,value){
    if(object==null){
        return
    }
    if(typeof(object)=="string"){
        object=getObject(object)
    }
    var values;
    if(isInstance(value,Array)){
        values=value
    } else {
        values=[value]
    }
    for(var i=0;i<values.length;i++){
        values[i]=values[i]==null?"":""+values[i]
    }
    if(object.length&&!object.type){
        while(values.length<object.length){
            values[values.length]=""
        }
        for(var i=0;i<object.length;i++){
            var obj=object[i];
            setValue(obj,inArray(obj.type,["checkbox","radio"])?values:values[i])
        }
        return
    }
    if(object.type){
        if(object.type.indexOf("select")>=0){
            for(var i=0;i<object.options.length;i++){
                var match=false;
                for(var k=0;!match&&k<values.length;k++){
                    if(object.options[i].value==String(values[k])){
                        match=true;
                        break
                    }
                }
                object.options[i].selected=match
            }
            return
        } else if(object.type=="radio"||object.type=="checkbox"){
            object.checked=inArray(object.value,values);
            return
        } else {
            object.value=values.length==0?"":values[0];
            return
        }
    } else if(typeof(object.innerHTML)!="undefined"){
        object.innerHTML=values.length==0?"":values[0]
    }
}
function decode(object){
    var args=decode.arguments;
    for(var i=1;i<args.length;i+=2){
        if(i<args.length-1){
            if(args[i]==object){
                return args[i+1]
            }
        } else {
            return args[i]
        }
    }
    return null
}
function select(){
    var args=select.arguments;
    for(var i=0;i<args.length;i+=2){
        if(i<args.length-1){
            if(booleanValue(args[i])){
                return args[i+1]
            }
        } else {
            return args[i]
        }
    }
    return null
}
function isEmpty(object){
    return object==null||String(object)==""||typeof(object)=="undefined"||(typeof(object)=="number"&&isNaN(object))
}
function ifEmpty(object,emptyValue){
    return isEmpty(object)?emptyValue:object
}
function ifNull(object,nullValue){
    return object==null?nullValue:object
}
function replaceAll(string,find,replace){
    return String(string).split(find).join(replace)
}
function repeat(string,times){
    var ret="";
    for(var i=0;i<Number(times);i++){
        ret+=string
    }
    return ret
}
function ltrim(string,chars){
    string=String(string);
    chars=chars||JST_CHARS_WHITESPACE;
    var pos=0;
    while(chars.indexOf(string.charAt(pos))>=0&&(pos<=string.length)){
        pos++
    }
    return string.substr(pos)
}
function rtrim(string,chars){
    string=String(string);
    chars=chars||JST_CHARS_WHITESPACE;
    var pos=string.length-1;
    while(chars.indexOf(string.charAt(pos))>=0&&(pos>=0)){
        pos--
    }
    return string.substring(0,pos+1)
}
function trim(string,chars){
    chars=chars||JST_CHARS_WHITESPACE;
    return ltrim(rtrim(string,chars),chars)
}
function lpad(string,size,chr){
    string=String(string);
    if(size<0){
        return ""
    }
    if(isEmpty(chr)){
        chr=" "
    } else {
        chr=String(chr).charAt(0)
    }
    while(string.length<size){
        string=chr+string
    }
    return left(string,size)
}
function rpad(string,size,chr){
    string=String(string);
    if(size<=0){
        return ""
    }
    chr=String(chr);
    if(isEmpty(chr)){
        chr=" "
    } else {
        chr=chr.charAt(0)
    }
    while(string.length<size){
        string+=chr
    }
    return left(string,size)
}
function crop(string,pos,size){
    string=String(string);
    if(size==null){
        size=1
    }
    if(size<=0){
        return ""
    }
    return left(string,pos)+mid(string,pos+size)
}
function lcrop(string,size){
    if(size==null){
        size=1
    }
    return crop(string,0,size)
}
function rcrop(string,size){
    string=String(string);
    if(size==null){
        size=1
    }
    return crop(string,string.length-size,size)
}
function capitalize(text,separators){
    text=String(text);
    separators=separators||JST_CHARS_WHITESPACE+'.?!';
    var out="";
    var last='';
    for(var i=0;i<text.length;i++){
        var current=text.charAt(i);
        if(separators.indexOf(last)>=0){
            out+=current.toUpperCase()
        } else {
            out+=current.toLowerCase()
        }
        last=current
    }
    return out
}
function onlySpecified(string,possible){
    string=String(string);
    possible=String(possible);
    for(var i=0;i<string.length;i++){
        if(possible.indexOf(string.charAt(i))==-1){
            return false
        }
    }
    return true
}
function onlyNumbers(string){
    return onlySpecified(string,JST_CHARS_NUMBERS)
}
function onlyLetters(string){
    return onlySpecified(string,JST_CHARS_LETTERS)
}
function onlyAlpha(string){
    return onlySpecified(string,JST_CHARS_ALPHA)
}
function onlyBasicLetters(string){
    return onlySpecified(string,JST_CHARS_BASIC_LETTERS)
}
function onlyBasicAlpha(string){
    return onlySpecified(string,JST_CHARS_BASIC_ALPHA)
}
function left(string,n){
    string=String(string);
    return string.substring(0,n)
}
function right(string,n){
    string=String(string);
    return string.substr(string.length-n)
}
function mid(string,pos,n){
    string=String(string);
    if(n==null){
        n=string.length
    }
    return string.substring(pos,pos+n)
}
function insertString(string,pos,value){
    string=String(string);
    var prefix=left(string,pos);
    var suffix=mid(string,pos)
    return prefix+value+suffix
}
function functionName(funct,unnamed){
    if(typeof(funct)=="function"){
        var src=funct.toString();
        var start=src.indexOf("function");
        var end=src.indexOf("(");
        if((start>=0)&&(end>=0)){
            start+=8;
            var name=trim(src.substring(start,end));
            return isEmpty(name)?(unnamed||"[unnamed]"):name
        }
    }
    if(typeof(funct)=="object"){
        return functionName(funct.constructor)
    }
    return null
}
function debug(object,separator,sort,includeObject,objectSeparator){
    if(object==null){
        return "null"
    }
    sort=booleanValue(sort==null?true:sort);
    includeObject=booleanValue(includeObject==null?true:sort);
    separator=separator||"\n";
    objectSeparator=objectSeparator||"--------------------";
    var properties=[];
    for(var property in object){
        var part=property+" = ";
        try {
            part+=object[property]
        } catch(e){
            part+="<Error retrieving value>"
        }
        properties[properties.length]=part
    }
    if(sort){
        properties.sort()
    }
    var out="";
    if(includeObject){
        try {
            out=object.toString()+separator
        } catch(e){
            out="<Error calling the toString() method>"
        }
        if(!isEmpty(objectSeparator)){
            out+=objectSeparator+separator
        }
    }
    out+=properties.join(separator);
    return out
}
function escapeCharacters(string,extraChars,onlyExtra){
    var ret=String(string);
    extraChars=String(extraChars||"");
    onlyExtra=booleanValue(onlyExtra);
    if(!onlyExtra){
        ret=replaceAll(ret,"\n","\\n");
        ret=replaceAll(ret,"\r","\\r");
        ret=replaceAll(ret,"\t","\\t");
        ret=replaceAll(ret,"\"","\\\"");
        ret=replaceAll(ret,"\'","\\\'");
        ret=replaceAll(ret,"\\","\\\\")
    }
    for(var i=0;i<extraChars.length;i++){
        var chr=extraChars.charAt(i);
        ret=replaceAll(ret,chr,"\\\\u"+lpad(new Number(chr.charCodeAt(0)).toString(16),4,'0'))
    }
    return ret
}
function unescapeCharacters(string,onlyExtra){
    var ret=String(string);
    var pos=-1;
    var u="\\\\u";
    onlyExtra=booleanValue(onlyExtra);
    do {
        pos=ret.indexOf(u);
        if(pos>=0){
            var charCode=parseInt(ret.substring(pos+u.length,pos+u.length+4),16);
            ret=replaceAll(ret,u+charCode,String.fromCharCode(charCode))
        }
    } while(pos>=0);
    if(!onlyExtra){
        ret=replaceAll(ret,"\\n","\n");
        ret=replaceAll(ret,"\\r","\r");
        ret=replaceAll(ret,"\\t","\t");
        ret=replaceAll(ret,"\\\"", "\"");
        ret=replaceAll(ret,"\\\'","\'");
        ret=replaceAll(ret,"\\\\","\\")
    }
    return ret
}
function writeCookie(name,value,document,expires,path,domain,secure){
    document=document||self.document;
    expires=expires||new Date(2500,12,31);
    var str=name+"="+(isEmpty(value)?"":encodeURIComponent(value))+"; expires="+expires.toGMTString();
    if(path!=null) str+="; path="+path;
    if(domain!=null) str+="; domain="+domain;
    if(secure!=null&&booleanValue(secure)) str+="; secure";
    document.cookie=str
}
function readCookie(name,document){
    document=document||self.document;
    var prefix=name+"=";
    var cookie=document.cookie;
    var begin=cookie.indexOf("; "+prefix);
    if(begin==-1){
        begin=cookie.indexOf(prefix);
        if(begin!=0) return null
    } else
        begin+=2;
    var end=cookie.indexOf(";",begin);
    if(end==-1)
        end=cookie.length;
    return decodeURIComponent(cookie.substring(begin+prefix.length,end))
}
function deleteCookie(name,document,path,domain){
    writeCookie(name,null,document,path,domain)
}
function dateAdd(date,amount,field){
    if(!isInstance(date,Date)){
        return null
    }
    if(amount==0){
        return new Date(date.getTime())
    }
    if(!isInstance(amount,Number)){
        amount=1
    }
    if(field==null) field=JST_FIELD_DAY;
    if(field<0||field>JST_FIELD_YEAR){
        return null
    }
    var time=date.getTime();
    if(field<=JST_FIELD_DAY){
        var mult=1;
        switch(field){
            case JST_FIELD_SECOND:
                mult=MILLIS_IN_SECOND;
                break;
            case JST_FIELD_MINUTE:
                mult=MILLIS_IN_MINUTE;
                break;
            case JST_FIELD_HOUR:
                mult=MILLIS_IN_HOUR;
                break;
            case JST_FIELD_DAY:
                mult=MILLIS_IN_DAY;
                break
        }
        var time=date.getTime();
        time+=mult*amount;
        return new Date(time)
    }
    var ret=new Date(time);
    var day=ret.getDate();
    var month=ret.getMonth();
    var year=ret.getFullYear();
    if(field==JST_FIELD_YEAR){
        year+=amount
    } else if(field==JST_FIELD_MONTH){
        month+=amount
    }
    while(month>11){
        month-=12;
        year++
    }
    day=Math.min(day,getMaxDay(month,year));
    ret.setDate(day);
    ret.setMonth(month);
    ret.setFullYear(year);
    return ret
}
function dateDiff(date1,date2,field){
    if(!isInstance(date1,Date)||!isInstance(date2,Date)){
        return null
    }
    if(field==null) field=JST_FIELD_DAY;
    if(field<0||field>JST_FIELD_YEAR){
        return null
    }
    if(field<=JST_FIELD_DAY){
        var div=1;
        switch(field){
            case JST_FIELD_SECOND:
                div=MILLIS_IN_SECOND;
                break;
            case JST_FIELD_MINUTE:
                div=MILLIS_IN_MINUTE;
                break;
            case JST_FIELD_HOUR:
                div=MILLIS_IN_HOUR;
                break;
            case JST_FIELD_DAY:
                div=MILLIS_IN_DAY;
                break
        }
        return Math.round((date2.getTime()-date1.getTime())/div)
    }
    var years=date2.getFullYear()-date1.getFullYear();
    if(field==JST_FIELD_YEAR){
        return years
    } else if(field==JST_FIELD_MONTH){
        var months1=date1.getMonth();
        var months2=date2.getMonth();
        if(years<0){
            months1+=Math.abs(years)*12
        } else if(years>0){
            months2+=years*12
        }
        return(months2-months1)
    }
    return null
}
function truncDate(date,field){
    if(!isInstance(date,Date)){
        return null
    }
    if(field==null) field=JST_FIELD_DAY;
    if(field<0||field>JST_FIELD_YEAR){
        return null
    }
    var ret=new Date(date.getTime());
    if(field>JST_FIELD_MILLISECOND){
        ret.setMilliseconds(0)
    }
    if(field>JST_FIELD_SECOND){
        ret.setSeconds(0)
    }
    if(field>JST_FIELD_MINUTE){
        ret.setMinutes(0)
    }
    if(field>JST_FIELD_HOUR){
        ret.setHours(0)
    }
    if(field>JST_FIELD_DAY){
        ret.setDate(1)
    }
    if(field>JST_FIELD_MONTH){
        ret.setMonth(0)
    }
    return ret
}
function getMaxDay(month,year){
    month=new Number(month)+1;
    year=new Number(year);
    switch(month){
        case 1:case 3:case 5:case 7:case 8:case 10:case 12:
            return 31;
        case 4:case 6:case 9:case 11:
            return 30;
        case 2:
            if((year%4)==0){
                return 29
            } else {
                return 28
            }
        default:
            return 0
    }
}
function getFullYear(year){
    year=Number(year);
    if(year<1000){
        if(year<50||year>100){
            year+=2000
        } else {
            year+=1900
        }
    }
    return year
}
function setOpacity(object,value){
    object=getObject(object);
    if(object==null){
        return
    }
    value=Math.round(Number(value));
    if(isNaN(value)||value>100){
        value=100
    }
    if(value<0){
        value=0
    }
    var style=object.style;
    if(style==null){
        return
    }
    style.MozOpacity=value/100;
    style.filter="alpha(opacity="+value+")"
}
function getOpacity(object){
    object=getObject(object);
    if(object==null){
        return
    }
    var style=object.style;
    if(style==null){
        return
    }
    if(style.MozOpacity){
        return Math.round(style.MozOpacity*100)
    } else if(style.filter){
        var regExp=new RegExp("alpha\\(opacity=(\d*)\\)");
        var array=regExp.exec(style.filter);
        if(array!=null&&array.length>1){
            return parseInt(array[1],10)
        }
    }
    return 100
}
function Pair(key,value){
    this.key=key==null?"":key;
    this.value=value;
    this.toString=function(){
        return this.key+"="+this.value
    }
}
function Value(key,value){
    this.base=Pair;
    this.base(key,value)
}
function Map(pairs){
    this.pairs=pairs||[];
    this.afterSet=null;
    this.afterRemove=null;
    this.putValue=function(pair){
        this.putPair(pair)
    }
    this.putPair=function(pair){
        if(isInstance(pair,Pair)){
            for(var i=0;i<this.pairs.length;i++){
                if(this.pairs[i].key==pair.key){
                    this.pairs[i].value=pair.value
                }
            }
            this.pairs[this.pairs.length]=pair;
            if(this.afterSet!=null){
                this.afterSet(pair,this)
            }
        }
    }
    this.put=function(key,value){
        this.putValue(new Pair(key,value))
    }
    this.putAll=function(map){
        if(!(map instanceof Map)){
            return
        }
        var entries=map.getEntries();
        for(var i=0;i<entries.length;i++){
            this.putPair(entries[i])
        }
    }
    this.size=function(){
        return this.pairs.length
    }
    this.get=function(key){
        for(var i=0;i<this.pairs.length;i++){
            var pair=this.pairs[i];
            if(pair.key==key){
                return pair.value
            }
        }
        return null
    }
    this.getKeys=function(){
        var ret=[];
        for(var i=0;i<this.pairs.length;i++){
            ret[ret.length]=this.pairs[i].key
        }
        return ret
    }
    this.getValues=function(){
        var ret=[];
        for(var i=0;i<this.pairs.length;i++){
            ret[ret.length]=this.pairs[i].value
        }
        return ret
    }
    this.getEntries=function(){
        return this.getPairs()
    }
    this.getPairs=function(){
        var ret=[];
        for(var i=0;i<this.pairs.length;i++){
            ret[ret.length]=this.pairs[i]
        }
        return ret
    }
    this.remove=function(key){
        for(var i=0;i<this.pairs.length;i++){
            var pair=this.pairs[i];
            if(pair.key==key){
                this.pairs.splice(i,1);
                if(this.afterRemove!=null){
                    this.afterRemove(pair,this)
                }
                return pair
            }
        }
        return null
    }
    this.clear=function(key){
        var ret=this.pairs;
        for(var i=0;i<ret.length;i++){
            this.remove(ret[i].key)
        }
        return ret
    }
    this.toString=function(){
        return functionName(this.constructor)+": {"+this.pairs+"}"
    }
    this.toObject=function(){
        ret={};

        for(var i=0;i<this.pairs.length;i++){
            var pair=this.pairs[i];
            ret[pair.key]=pair.value
        }
        return ret
    }
}
function StringMap(string,nameSeparator,valueSeparator,isEncoded){
    this.nameSeparator=nameSeparator||"&";
    this.valueSeparator=valueSeparator||"=";
    this.isEncoded=isEncoded==null?true:booleanValue(isEncoded);
    var pairs=[];
    string=trim(string);
    if(!isEmpty(string)){
        var namesValues=string.split(nameSeparator);
        for(i=0;i<namesValues.length;i++){
            var nameValue=namesValues[i].split(valueSeparator);
            var name=trim(nameValue[0]);
            var value="";
            if(nameValue.length>0){
                value=trim(nameValue[1]);
                if(this.isEncoded){
                    value=decodeURIComponent(value)
                }
            }
            var pos=-1;
            for(j=0;j<pairs.length;j++){
                if(pairs[j].key==name){
                    pos=j;
                    break
                }
            }
            if(pos>=0){
                var array=pairs[pos].value;
                if(!isInstance(array,Array)){
                    array=[array]
                }
                array[array.length]=value;
                pairs[pos].value=array
            } else {
                pairs[pairs.length]=new Pair(name,value)
            }
        }
    }
    this.base=Map;
    this.base(pairs);
    this.getString=function(){
        var ret=[];
        for(var i=0;i<this.pairs.length;i++){
            var pair=this.pairs[i];
            ret[ret.length]=pair.key+this.valueSeparator+this.value
        }
        return ret.join(this.nameSeparator)
    }
}
function QueryStringMap(location){
    this.location=location||self.location;
    var string=String(this.location.search);
    if(!isEmpty(string)){
        string=string.substr(1)
    }
    this.base=StringMap;
    this.base(string,"&","=",true);
    this.putPair=function(){
        alert("Cannot put a value on a query string")
    }
    this.remove=function(){
        alert("Cannot remove a value from a query string")
    }
}
function CookieMap(document){
    this.document=document||self.document;
    this.base=StringMap;
    this.base(document.cookie,";","=",true);
    this.afterSet=function(pair){
        writeCookie(pair.key,pair.value,this.document)
    }
    this.afterRemove=function(pair){
        deleteCookie(pair.key,this.document)
    }
}
function ObjectMap(object){
    this.object=object;
    var pairs=[];
    for(var property in this.object){
        pairs[pairs.length]=new Pair(property,this.object[property])
    }
    this.base=Map;
    this.base(pairs);
    this.afterSet=function(pair){
        this.object[pair.key]=pair.value
    }
    this.afterRemove=function(pair){
        try {
            delete object[pair.key]
        } catch(exception){
            object[pair.key]=null
        }
    }
}
function StringBuffer(initialCapacity){
    this.initialCapacity=initialCapacity||10;
    this.buffer=new Array(this.initialCapacity);
    this.append=function(value){
        this.buffer[this.buffer.length]=value;
        return this
    }
    this.clear=function(){
        delete this.buffer;
        this.buffer=new Array(this.initialCapacity)
    }
    this.toString=function(){
        return this.buffer.join("")
    }
    this.length=function(){
        return this.toString().length
    }
}
function ctoUpper(ipos, string)
{

}